先複習一下上次的結尾處
namespace WebApplication2;
public class BankAccount
{
public string Number { get; }
public string Owner { get; set; }
public decimal Balance { get; }
private static int _sAccountNumberSeed = 1234567890;
}
還記得前面有提到, C# 是一個強型別的語言
,所以在上面定義變數的地方都需要宣告變數的型別
💡 Value Type (實質類別):存取的是實際的數值,也就是記憶體位址。
每次異動都會配置一個新的記憶體位置
//Value Type
int i; // 宣告 *此時尚未配置記憶體位址,無法直接使用
int x;
i = 1; // 設定初始值 *系統自動配置記憶體
x = i; // x = 1 *系統複製 i 的記憶體內容至另一個記憶體位址
Console.WriteLine(i); // i=1
Console.WriteLine(x); // x=1
i = 3; // 系統不需要再配置新的記憶體位置,它會將 i 的值設定為 3,原記憶體位置並不會拋棄並回收
x = 4;
Console.WriteLine(i); // i=3
Console.WriteLine(x); // x=4
💡 Reference Type (參考類別)
string today = "2023"
// 自定義 Person
Person person1 = new Person();
//物件必須要透過「new Class名稱()」的方式建立,沒有指向任何物件的 reference(參考) 變數,則存放著「null」
person1.Name = "Alice";
person1.Age = 30;
// 將 person1的數值賦予给person2,共同指向同一个物件
Person person2 = person1;
// 因為 person1 跟 person2 指向的記憶體為相同,因此修改 person2 的值會影響 person1
person2.Age = 35;
Console.WriteLine($"person1: {person1.Name}, Age: {person1.Age}"); //"Alice", 35
Console.WriteLine($"person2: {person2.Name}, Age: {person2.Age}"); //"Alice", 35
從記憶體角度來看
物件存在記憶體的方式有兩種
堆疊(stack):先進後出,後進先出; LIFO (last in, first out)
堆積(heap):不管順序,不會特別做排序,只將資料統一集中。
C# 執行時期會將拿到的記憶體空間切出 stack & heap 區域
參考文章: